gusucode.com > VC 达内MFC例子集源码-源码程序 > VC 达内MFC例子集源码-源码程序/code/20101231/day05.txt
一 动态创建 1 动态创建的作用 创建未知类型的对象. 2 动态创建的相关 2.1 必须CObject派生的子孙类 2.2 DECLARE_DYNCREATE 2.3 IMPLEMENT_DYNCREATE 3 动态创建的使用 3.1 定义类 3.2 创建对象 4 动态创建的实现 4.1 代码 class CAnimal : public CObject { public: DECLARE_DYNAMIC(CAnimal) static CObject* PASCAL CreateObject(); } CObject* PASCAL CAnimal::CreateObject() { return new CAnimal; } IMPLEMENT_RUNTIMECLASS(CAnimal, CObject, 0xFFFF, CAnimal::CreateObject) AFX_COMDAT const AFX_DATADEF CRuntimeClass CAnimal::classCAnimal = { "CAnimal", sizeof(class CAnimal), 0xFFFF, &CAnimal::CreateObject, &CAnimal::_GetBaseClass, NULL }; 4.2 说明 CAnimal::CreateObject 创建CAniaml 类的对象 其他与DYNAMIC的定义相同,只是将 CAnimal::CreateObject地址保存到 classCAnimal变量当中。 4.3 实现过程 pClass->CreateObject() 4.3.1 获取该类的RuntimeClass变量的 指针pClass 4.3.2 调用RuntimeClass的CreateObject 函数. 4.3.3 在CreateObject函数中,调用 m_pfnCreateObject函数指针,这个 函数指针的地址是该类的CreateObject 函数的地址. 4.3.4 在CreateObject函数,会使用new 操作符,将该类的对象创建并返回. 二 文档 1 MFC文档类作用 提供数据管理的功能,包括数据的存储 等功能, 也可以提供文件打开等消息 处理. 2 MFC文档相关 CDocument 文档类,父类是CCmdTarget. 提供了MFC关于文档的封装. 3 MFC文档的使用 3.1 定义文档类 3.2 创建文档 4 创建过程 4.1 CFrameWnd::LoadFrame函数创建 FrameWnd窗口 4.2 在CFrameWnd的WM_CREATE消息 (OnCreate函数)中,调用CFrameWnd 的OnCreateClient函数. 4.3 OnCreateClient函数中,会根据 传入View的RuntimeClass信息,将 View对象和窗口创建. 4.4 在CView的WM_CREATE消息 (OnCreate函数)中,获取到创建参数 中的CDoument的地址 4.5 使用CDoument::AddView函数,将 View的地址保存到Document中,同时 将Dociment的地址保存到View中 m_pDocumet成员变量. 5 消息处理 5.1 添加消息映射宏 5.2 添加消息处理函数 5.3 WM_COMMAND命令消息处理顺序 5.3.1 CView 5.3.2 CDocument 5.3.3 CFrameWnd 5.3.4 CWinApp 5.4 执行过程 5.4.1 WM_COMMAND发送到程序的顶层 窗口FrameWnd 5.4.2 FrameWnd获取当前活动视图, 将命令派发给View 5.4.3 在View中进行消息处理,然后 派发给CDocument. 5.4.4 CDocument进行消息处理,返回 到FrameWnd, FrameWnd自己进行 消息处理 5.4.5 派发给CWinApp进行消息处理 三 MFC单文档视图应用程序(SDI) 1 单文档视图 只能对单个文档进行处理的应用程序. 2 MFC单文档视图相关 2.1 CWinApp\CFrameWnd\CView\CDocument 2.2 CDocTemplate - 文档模版类,父类 是CCmdTarget类.作用是处理框架窗口、 视图及文档之间的关系。它是一个抽象 类,不能直接使用。可以使用的是两个 子类: CSingleDocTemplate - 单文档模板类 CMultiDocTemplate - 多文档模板类 3 单文档视图的实现 3.1 创建单文档模版对象 CSingleDocTemplate * pTemp = NULL; pTemp = new CSingleDocTemplate( IDR_MAINFRM, RUNTIME_CLASS( CSdiDocument ), RUNTIME_CLASS( CSdiFrame ), RUNTIME_CLASS( CSdiView) ); 3.2 保存到CWinApp中 AddDocTemplate( pTemp ); 3.3 新建文档 OnFileNew( ); 4 单文档视图创建过程 4.1 创建 CSingleDocTemplate对象pTemplate, 同时将FrameWnd/View/Document的 RUNTIEM_CLASS信息保存: CRuntimeClass* m_pDocClass; // class for creating new documents CRuntimeClass* m_pFrameClass; // class for creating new frames CRuntimeClass* m_pViewClass; // class for creating new views 4.2 调用AddDocTemplate将模版对象 pTemplate 添加到CWinApp当中. 4.3 在CWinApp中,将pTemplate保存到 文档模版管理器m_pDocManager中. CDocManager * m_pDocManager; 4.4 使用CWinApp的OnFileNew等其他 方式创建文档. 4.5 在CWinApp的OnFileNew中,调用 CDocManager的OnFileNew函数 4.6 在 CDocManager的OnFileNew函数 查找模板pTemplate.然后调用 pTemplate的OpenDocumentFile函数 打开新文档 pTemplate->OpenDocumentFile( NULL ); 4.7 使用CreateNewDocument函数.创建 一个文档对象pDocument; 4.8 使用CreateNewFrame函数以及 pDocument,创建框架窗口. 4.9 创建框架窗口时,使用CFrameWnd的 LoadFrame函数,将窗口创建. 5 单文档视图的数据关系 CWinApp |-> m_pMainWnd | |-> m_pActiveView | |-> m_pDocument(m_pOnlyDoc) | |-> viewList | |->view指针 | |->view... |-> m_pDocMananger |-> templateList |->单文档template | |->文档指针m_pOnlyDoc(m_pDocument) |->单文档template... 四 MFC多文档视图应用程序(MDI) 1 多文档视图 只能对多个文档进行处理的应用程序. 2 MFC多文档视图相关 2.1 CWinApp/CView/CDocument 2.2 CMDIFrameWnd/CMDIChildWnd 使用MDI框架窗口,它们的父类 都是CFrameWnd. 2.3 CMultiDocTemplate 多文档的 文档模版类 3 MDI程序创建 3.1 定义模版对象 CMultiDocTemplate * pDocTemp = NULL; pDocTemp = new CMultiDocTemplate( IDR_CHILDFRM, RUNTIME_CLASS( CMdiDocument ), RUNTIME_CLASS( CChildFrame ), RUNTIME_CLASS( CMdiView ) ); 3.2 保存到CWinApp中 AddDocTemplate( pTemp ); 3.3 创建主窗口 创建CMDIFrameWnd的窗口 3.4 新建文档 OnFileNew( );